﻿Imports FairShop.Helpers
Imports FairShop.Operaties
Imports System.ComponentModel

Namespace Controls

    Public Class DozenToevoegControl
        Implements INotifyPropertyChanged

#Region "Properties"

        Private _bestaandeHoofdartikels As ArtikelLijstDataSet

        <Browsable(False)> _
        <Bindable(True)> _
        Public Property BarcodeDoos() As String
            Get
                Return tbBarcodeDoos.Text
            End Get
            Set(ByVal value As String)
                tbBarcodeDoos.Text = value
                OnPropertyChanged("BarcodeDoos")
                'InvoerArtikelsControl1.Focus()
            End Set
        End Property

        <Browsable(False)> _
        Public ReadOnly Property BarcodeArtikel() As String
            Get
                Return InvoerArtikelsControl1.Barcode
            End Get
        End Property

        <Browsable(False)> _
        Public ReadOnly Property AantalArtikelsPerDoos() As Integer
            Get
                Return InvoerArtikelsControl1.Aantal
            End Get
        End Property

#End Region

#Region "Eigen events"

        Public Event PropertyChanged(ByVal sender As Object, ByVal e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged

#End Region

#Region "Event handling"

        Protected Overrides Sub OnLoad(ByVal e As EventArgs)
            MyBase.OnLoad(e)
            If (Not Me.DesignMode) Then
                ' bestaande artikels slechts eenmaal ophalen
                _bestaandeHoofdartikels = New ArtikelLijstDataSet()
                SamengesteldeArtikelsDal.FillHoofdartikels(_bestaandeHoofdartikels)

                InvoerArtikelsControl1.LaatDozenToe = False ' een doos mag zelf geen dozen bevatten
            End If
        End Sub

        Private Sub tbBarcodeDoos_KeyUp(ByVal sender As Object, ByVal e As KeyEventArgs) Handles tbBarcodeDoos.KeyUp
            Select Case e.KeyCode
                Case Keys.Enter
                    InvoerArtikelsControl1.Focus()
                    e.Handled = True
            End Select
        End Sub

        Private Sub InvoerArtikelsControl1_BarcodeConfirmed(ByVal sender As Object, ByVal e As InvoerArtikelsControl.BarcodeConfirmedEventArgs) _
                 Handles InvoerArtikelsControl1.BarcodeConfirmed
            Try
                lblInfo.Text = String.Empty
                Dim eersteArtikelMetDezeBarcode As ArtikelsDataSet.ArtikelsRow = _
                    (From a In Utility.Data.Artikels _
                    Where a.Barcode = InvoerArtikelsControl1.Barcode _
                    Select a).FirstOrDefault
                If (eersteArtikelMetDezeBarcode Is Nothing) Then
                    ' barcode niet gevonden in artikeltabel, doe logging
                    Dal.OnbekendeBarcodeToevoegen(InvoerArtikelsControl1.Barcode)
                    e.BarcodeStatus = InvoerArtikelsControl.BarcodeStatusType.Invalid
                    lblInfo.Text = "De barcode van het deelartikel is niet gekend."
                Else
                    If (Me.AantalArtikelsPerDoos = 1) Then
                        e.BarcodeStatus = InvoerArtikelsControl.BarcodeStatusType.Invalid
                        lblInfo.Text = "Een doos moet meer dan 1 artikel bevatten."
                    Else
                        e.BarcodeStatus = InvoerArtikelsControl.BarcodeStatusType.KeepContent
                        Sound.PlayOK()
                    End If
                End If
            Catch ex As Exception
                lblInfo.Text = "Fout bij het verwerken van de barcode van het artikel"
                log.WriteError("DozenToevoegControl.InvoerArtikelsControl1_BarcodeConfirmed", ex)
                e.BarcodeStatus = InvoerArtikelsControl.BarcodeStatusType.Invalid
            End Try
        End Sub

        Private Sub tbBarcodeDoos_TextChanged(ByVal sender As Object, ByVal e As EventArgs) Handles tbBarcodeDoos.TextChanged
            OnPropertyChanged("BarcodeDoos")
            lblInfo.Text = String.Empty
        End Sub

        Private Sub tbBarcodeDoos_Validating(ByVal sender As Object, ByVal e As CancelEventArgs) Handles tbBarcodeDoos.Validating
            Dim errorMsg As String = Nothing
            If (Not BarcodeHelper.IsValid(tbBarcodeDoos.Text)) Then
                If (tbBarcodeDoos.Text.Length = 0) Then
                    errorMsg = "De barcode voor de doos is verplicht."
                Else
                    errorMsg = BarcodeHelper.INVALID_MESSAGE
                End If
                e.Cancel = True
            Else
                Dim bestaandHoofdartikelMetDezeBarcode As ArtikelLijstDataSet.ArtikelsRow = _
                     (From h In _bestaandeHoofdartikels.Artikels _
                      Where h.Barcode = tbBarcodeDoos.Text _
                      Select h).FirstOrDefault
                If (bestaandHoofdartikelMetDezeBarcode IsNot Nothing) Then
                    errorMsg = "Er is al een samengesteld artikel met deze barcode."
                    e.Cancel = True
                End If
            End If
            SetOrClearError(tbBarcodeDoos, errorMsg)
        End Sub

        Private Sub InvoerArtikelsControl1_Validating(ByVal sender As Object, ByVal e As CancelEventArgs) Handles InvoerArtikelsControl1.Validating
            Dim errorMsg As String = Nothing

            Dim eersteArtikelMetDezeBarcode As ArtikelsDataSet.ArtikelsRow = ArtikelsBL.GetEersteVerkoopbaarArtikelMetBarcode(InvoerArtikelsControl1.Barcode)
            If (eersteArtikelMetDezeBarcode Is Nothing) Then
                errorMsg = "De barcode van het deelartikel is niet gekend."
                e.Cancel = True
            Else
                If (Me.AantalArtikelsPerDoos = 1) Then
                    errorMsg = "Een doos moet meer dan 1 artikel bevatten."
                    e.Cancel = True
                Else
                    e.Cancel = False
                End If
            End If
            SetOrClearError(InvoerArtikelsControl1, errorMsg)
        End Sub

#End Region

#Region "Public methods"

        Public Sub Clear(ByVal message As String)
            Me.tbBarcodeDoos.Text = String.Empty
            Me.InvoerArtikelsControl1.Clear()
            Me.ErrorProvider1.Clear()
            lblInfo.Text = message
            tbBarcodeDoos.Focus()
        End Sub

#End Region

#Region "Private methods"

        Private Sub SetOrClearError(ByVal ctrl As Control, ByVal msg As String)
            If String.IsNullOrEmpty(msg) Then
                Me.ErrorProvider1.SetError(ctrl, Nothing)
                Me.lblInfo.Text = String.Empty
            Else
                Me.ErrorProvider1.SetError(ctrl, msg)
                Me.lblInfo.Text = msg
            End If
        End Sub

        Private Sub OnPropertyChanged(ByVal propertyName As String)
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
        End Sub

#End Region

    End Class

End Namespace
